home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 98 / Skunkware 98.iso / src / net / bind-contrib.tar.gz / bind-contrib.tar / contrib / misc / checksoa.pl < prev    next >
Encoding:
Perl Script  |  1996-10-25  |  3.3 KB  |  150 lines

  1. #!/usr/bin/perl -w
  2.  
  3. # checksoa.pl - check SOA serial numbers given a local(?) named.boot file
  4. # vix 19sep95 [original]
  5. #
  6. # $Id: checksoa.pl,v 8.2 1996/10/25 17:07:55 vixie Exp $
  7.  
  8. $Dig = 'dig';
  9. $, = ' ';
  10. $| = 1;
  11.  
  12. sub usage {
  13.     print STDERR <<":EOF:";
  14. usage: $0 [-d] -i priaddr {-a aliasaddr}... {-n servname}... bootfile...
  15. (i.e.: $0 -i 127.0.0.1 -a 192.5.5.1 -a 192.5.5.2 -n gw.home.vix.com named.boot
  16. :EOF:
  17.     exit(1);
  18. }
  19.  
  20. $something = 0;
  21. $Debug = 0;
  22. while ($_ = shift) {
  23.     if (/\-/) {
  24.         $_ = $';
  25.         if ($_ eq 'i') {
  26.             ($_ = shift) =~ tr/A-Z/a-z/;
  27.             delete $MyServerA{$MyServer};
  28.             $MyServer = $_;
  29.         } elsif ($_ eq 'a') {
  30.             ($_ = shift) =~ tr/A-Z/a-z/;
  31.             $MyServerA{$_} = '';
  32.         } elsif ($_ eq 'n') {
  33.             ($_ = shift) =~ tr/A-Z/a-z/;
  34.             $MyServerN{$_} = '';
  35.         } elsif ($_ eq 'd') {
  36.             $Debug++;
  37.         } else {
  38.             &usage();
  39.         }
  40.     } else {
  41.         &usage() unless $MyServer;
  42.         print "<myserv $MyServer,",
  43.             "A(",keys(%MyServerA),"),",
  44.             "N(",keys(%MyServerN),")\n"    if $Debug;
  45.         &bootfile($_);
  46.         $something++;
  47.     }
  48. }
  49. &usage() unless $something;
  50. exit(0);
  51.  
  52. sub bootfile {
  53.     local($bootfile) = @_;
  54.     local(*f, $_, $zone, $server, @servers);
  55.  
  56.     open(f, "<$bootfile") || die "$bootfile: $!";
  57.     while (<f>) {
  58.         chop; split;
  59.         $_ = shift(@_);
  60.         $Output = '';
  61.         if ($_ eq 'primary') {
  62.             $zone = shift(@_);
  63.             @servers = &getnsaddrs($zone, $MyServer);
  64.         } elsif ($_ eq 'secondary') {
  65.             $zone = shift(@_);
  66.             @servers = ();
  67.             while (defined($_ = shift(@_)) && /^(\d+\.){3}\d+$/) {
  68.                 push(@servers, $_);
  69.             }
  70.         } else {
  71.             next;
  72.         }
  73.         next unless length($zone) && $#servers >= $[;
  74.         $okservers = 0;
  75.         $serial = &getserial($zone, $MyServer);
  76.         print "<servers @servers>\n" if $Debug;
  77.         foreach $server (@servers) {
  78.             $_ = &getserial($zone, $server);
  79.             if ($_ != $serial) {
  80.                 $Output .= sprintf("\t%-16s %s\n", $server,
  81.                            "has wrong serial ($_)");
  82.             } else {
  83.                 $okservers++;
  84.             }
  85.         }
  86.         if ($Output || $Debug) {
  87.             print "[$zone]: serial $serial," .
  88.                 " $okservers good server(s)\n" .
  89.                 $Output;
  90.         }
  91.     }
  92.     close(f);
  93.     return;
  94. }
  95.  
  96. sub getserial {
  97.     local($zone, $server) = @_;
  98.     local(*dig, $serial, $_, $isauth);
  99.  
  100.     $isauth = 0;
  101.     $serial = 0;
  102.     print "<$Dig @$server $zone soa>\n" if $Debug;
  103.     open(dig, "$Dig @$server $zone soa 2>&1 |") || die "dig: $!";
  104.     while (<dig>) {
  105.         chop;
  106.         $Output .= sprintf("\t%-16s %s\n", $server, $_) if /res_send/;
  107.         $isauth = 't' if /\bflags\:.*\Waa\b/io;
  108.         next unless $isauth;
  109.         $serial = $1 if !$serial && /^\s+(\d+)\s*\;\s*serial\s*/io;
  110.     }
  111.     close(dig);
  112.     return ($serial);
  113. }
  114.  
  115. sub getnsaddrs {
  116.     local($zone, $server) = @_;
  117.     local(*dig, @ns, %a, @nsaddrs, $_, $isauth);
  118.  
  119. # vix.com.        3600    NS      ns.uu.net.
  120. # ns.uu.net.      52647   A       137.39.1.3
  121.  
  122.     $isauth = 0;
  123.     @ns = ();
  124.     %a = ();
  125.     print "<$Dig @$server $zone soa>\n" if $Debug;
  126.     open(dig, "$Dig @$server $zone ns 2>&1 |") || die "dig: $!";
  127.     while (<dig>) {
  128.         chop; tr/A-Z/a-z/;
  129.         $Output .= sprintf("\t%-16s %s\n", $server, $_) if /res_send/;
  130.         $isauth = 't' if /\bflags\:.*\Waa\b/io;
  131.         next unless $isauth;
  132.         if (/^[\w\_\.\-]+\s+\d+\s+NS\s+([\w\_\-\.]+)$/io) {
  133.             next if defined $MyServerN{$1};
  134.             push(@ns, $1);
  135.         }
  136.         if (/^([\w\_\.\-]+)\s+\d+\s+A\s+((\d+\.){3}\d+)$/io) {
  137.             next if $2 eq $MyServer;
  138.             next if defined $MyServerA{$2};
  139.             $a{$1} = $2;
  140.         }
  141.     }
  142.     close(dig);
  143.     @nsaddrs = ();
  144.     foreach (@ns) {
  145.         push(@nsaddrs, $a{$_}) if defined $a{$_};
  146.     }
  147.     print "<getnsaddrs($zone, $server) -> (@nsaddrs)>\n" if $Debug;
  148.     return (@nsaddrs);
  149. }
  150.